<?php
/**
 * Description of VotoDAO
 *
 * @author Magno
 */
class VotoDAO {

    private $conexao;
    private $enqueteDAO;
    private $clienteDAO;
    private $respostaDAO;

    public function __construct() {
        $this->conexao = Conexao::getConexao();
        $this->enqueteDAO = new EnqueteDAO();
        $this->clienteDAO = new ClienteDAO();
        $this->respostaDAO = new RespostaDAO();
    }

    public function salvar($voto) {

        try {

            if ($this->existe($voto->getEnquete()->getEnqueteID(), $voto->getCliente()->getUsuarioID())) {

                $statment = $this->conexao->prepare("UPDATE voto SET
                        repostaID = :repostaID
                        WHERE enqueteID = :enqueteID AND
                        usuarioID = :usuarioID");
            } else {

                $statment = $this->conexao->prepare("INSERT INTO voto(enqueteID,usuarioID,respostaID)
                    VALUES (:enqueteID,:usuarioID,:respostaID);");
            }

            if ($statment->execute($voto->toBD())) {

                if ($voto->getVotoID() == null || $voto->getVotoID() <= 0)
                    $voto->setVotoID($this->conexao->lastInsertId());
                return $voto;
            }else {
                $erros = $statment->errorInfo();
                throw new Exception("Erro VotoDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

    public function excluir($enqueteID, $usuarioID) {

        try {

            $statment = $this->conexao->prepare("DELETE FROM voto WHERE enqueteID = :enqueteID AND usuarioID = :usuarioID");
            $statment->bindParam(':enqueteID', $enqueteID);
            $statment->bindParam(':usuarioID', $usuarioID);

            if (!$statment->execute()) {
                $erros = $statment->errorInfo();
                throw new Exception("Erro VotoDAO: " . $erros[2]);
            }
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

    public function listar($pagina = 0, $enqueteID = -1, $usuarioID = -1, $respostaID = -1, $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina);
            $where = $this->getWhere($enqueteID, $usuarioID, $respostaID);
            $votos = array();
            $statment = $this->conexao->query("SELECT * FROM voto u $where $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $voto = new VotoBean(null, null, null, $row['data']);

                if($carregarDependencias){
                    $voto->setEnquete($this->enqueteDAO->buscarPorID($row['enqueteID']));
                    $voto->setCliente($this->clienteDAO->buscarPorID($row['usuarioID']));
                    $voto->setResposta($this->respostaDAO->buscarPorID($row['respostaID']));
                }

                $votos[] =  $voto;
            }

            return $votos;
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

    public function listarPorOrdem($pagina = 0, $tamanho = 0, $ordem = "respostaID", $direcao = "ASC", $carregarDependencias = false) {
        try {

            $limite = Util::getPaginacao($pagina,$tamanho);
            $votos = array();
            $statment = $this->conexao->query("SELECT * FROM voto u ORDER BY u.$ordem $direcao $limite");

            foreach ($statment->fetchAll(PDO::FETCH_SERIALIZE) as $row){
                $voto = new VotoBean(null, null, null, $row['data']);

                if($carregarDependencias){
                    $voto->setEnquete($this->enqueteDAO->buscarPorID($row['enqueteID']));
                    $voto->setCliente($this->clienteDAO->buscarPorID($row['usuarioID']));
                    $voto->setResposta($this->respostaDAO->buscarPorID($row['respostaID']));
                }

                $votos[] = $voto;
            }

            return $votos;
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

    public function buscarPorID($enqueteID = -1, $usuarioID = -1, $carregarDependencias = false) {
        try {

            $row = $this->conexao->query("SELECT * FROM voto enqueteID = $enqueteID AND usuarioID = $usuarioID ")->fetch(PDO::FETCH_SERIALIZE);

            if (isset ($row['votoID']) && $row['votoID'] > 0) {
                $voto = new VotoBean(null, null, null, $row['data']);

                if($carregarDependencias){
                    $voto->setEnquete($this->enqueteDAO->buscarPorID($row['enqueteID']));
                    $voto->setCliente($this->clienteDAO->buscarPorID($row['usuarioID']));
                    $voto->setResposta($this->respostaDAO->buscarPorID($row['respostaID']));
                }
                
                return $voto;
            } else {
                return null;
            }
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

    public function existe($enqueteID = -1, $usuarioID = -1){
        if($this->buscarPorID($enqueteID, $usuarioID) != null)
            return true;
        return false;
    }

    private function getWhere($enqueteID = -1, $usuarioID = -1, $respostaID = -1) {

        $where = " WHERE 1 = 1 ";

        if (isset($enqueteID) && $enqueteID > 0) {
            $where = $where . " AND u.enqueteID = $enqueteID ";
        }

        if (isset($usuarioID) && $usuarioID > 0) {
            $where = $where . " AND u.usuarioID = $usuarioID ";
        }

        if (isset($respostaID) && $respostaID > 0) {
            $where = $where . " AND u.respostaID = $respostaID ";
        }

        return $where;
    }

    public function total($enqueteID = -1, $usuarioID = -1, $respostaID = -1) {
        try {

            $where = $this->getWhere($enqueteID, $usuarioID, $respostaID);
            $total = $this->conexao->query("SELECT COUNT(u.votoID) total FROM voto u $where")->fetch(PDO::FETCH_COLUMN);
            return $total;
        } catch (PDOException $err) {
            throw new Exception("Erro VotoDAO:" . $err->getMessage());
        }
    }

}
?>